/*
 * =====================================================================================
 * Copyright (C) 2023 Ingenic Semiconductor Co.,Ltd
 * All Rights Reserved
 *
 * Filename     : gpio.h
 * Author       : Keven <keven.ywhan@ingenic.com>
 * Created      : 2024/06/05 11:15
 * Description  :
 *
 * =====================================================================================
 */

#ifndef __GPIO_H__
#define __GPIO_H__

#define GPIO_PA(n) 	(0*32 + n)
#define GPIO_PB(n) 	(1*32 + n)
#define GPIO_PC(n) 	(2*32 + n)
#define GPIO_PD(n) 	(3*32 + n)
#define GPIO_PE(n) 	(4*32 + n)
#define GPIO_PF(n) 	(5*32 + n)
#define GPIO_PG(n) 	(6*32 + n)

enum gpio_function {
	GPIO_FUNC_0     = 0x00,  //0000, GPIO as function 0 / device 0
	GPIO_FUNC_1     = 0x01,  //0001, GPIO as function 1 / device 1
	GPIO_FUNC_2     = 0x02,  //0010, GPIO as function 2 / device 2
	GPIO_FUNC_3     = 0x03,  //0011, GPIO as function 3 / device 3
	GPIO_INPUT	= 0x06,	 //0110, GPIO as input
};

enum gpio_port {
	GPIO_PORT_A,
	GPIO_PORT_B,
	GPIO_PORT_C,
	GPIO_PORT_D,
	GPIO_PORT_E,
	GPIO_PORT_F,
	GPIO_PORT_G,
	/* this must be last */
	GPIO_NR_PORTS,
};

uint32_t gpio_request(uint32_t gpio, const char *label);
int32_t gpio_free(uint32_t gpio);
void gpio_port_set_value(enum gpio_port port, uint32_t pin, uint32_t value);
void gpio_port_direction_input(enum gpio_port port, uint32_t pin);
void gpio_port_direction_output(enum gpio_port port, uint32_t pin, uint32_t value);
int32_t gpio_set_value(uint32_t gpio, uint32_t value);
int32_t gpio_get_value(uint32_t gpio);
int32_t gpio_direction_input(uint32_t gpio);
int32_t gpio_direction_output(uint32_t gpio, uint32_t value);
void gpio_set_func(enum gpio_port port, enum gpio_function func, uint32_t pins);

#endif /* __GPIO_H__ */

